#include <CtrlLib/CtrlLib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <fstream>
#include <locale.h>

using namespace Upp;
using namespace std;

#include "Dialogs.h"

// Variables externas
extern PostgreSQLSession pg_session;
FILE *leerArchEx;

/**
 Ventana que muestra el listado de afiliados.
*/
ListadoAfiliadosDlg::ListadoAfiliadosDlg()
{
	CtrlLayoutCancel(*this, "Gestión de Afiliados Activos");
	MaximizeBox().MinimizeBox();
	Sizeable().Zoomable();
	Maximize();
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	AddFrame(menu);
	AddFrame(TopSeparatorFrame());
	AddFrame(status);
	menu.Set(THISBACK(MenuPrincipal));
	menu.WhenHelp = status;
	
	verAltas_btn.SetImage(CentroJyPImg::altas_mes());
	verBajas_btn.SetImage(CentroJyPImg::bajas_mes());
	verModificar_btn.SetImage(CentroJyPImg::user_edit());
	eliminar_btn.SetImage(CentroJyPImg::user_remove16x16());
	ayuda_btn.SetImage(CentroJyPImg::help_contents16x16());
	cancel.SetImage(CentroJyPImg::cancelar());
	carnet_btn.SetImage(CentroJyPImg::carnet());
	padron_btn.SetImage(CentroJyPImg::imprimir_padron());
	listaAdherentes_btn.SetImage(CentroJyPImg::adherentes());
	listaSolicitudes_btn.SetImage(CentroJyPImg::_2clientes_img_2__2_());
	
	// Se completan las columnas de la vista de lista de afiliados
	lista_afiliados.SetSession(pg_session);
	lista_afiliados.SetTable(AFILIADO,NRO_SOCIO_A);
	
	lista_afiliados.AddColumn(NRO_SOCIO_A,"Nro. Socio (Caja Cba.)").NoEdit().Sorting();
	lista_afiliados.AddColumn(NRO_AFILIADO_A,"Nro. Afiliado (CentroJyP)").NoEdit().Sorting();
	lista_afiliados.AddColumn(TIPO_DOC_A,"Tipo Documento").NoEdit();
	lista_afiliados.AddColumn(DNI_A,"Documento").NoEdit().Sorting();
	lista_afiliados.AddColumn(APELLIDOS_A,"Apellido/s y Nombres/s").NoEdit().Sorting();
/*	lista_afiliados.AddColumn(NOMBRES_A,"Nombre/s").NoEdit();*/
	lista_afiliados.AddColumn(BENEFICIO_A,"Beneficio").NoEdit();
	lista_afiliados.AddColumn(LEY_A,"Ley").NoEdit();
	lista_afiliados.AddColumn(SUB_A,"Sub").NoEdit();
	lista_afiliados.AddColumn(CDGO_DTO_A,"Cód. Dcto.").NoEdit();
	
	lista_afiliados.Query();
	lista_afiliados.GoEndPostQuery();
	cant_afiliados.SetText(AsString(lista_afiliados.GetCount()));
	
	lista_afiliados.WhenLeftDouble = THISBACK(ModificarAfiliado);
	lista_afiliados.WhenSel = THISBACK(HabilitarEdicionAfiliado);
	
	// Se incluyen los campos disponibles para buscar.
	buscar_por.Add("- Seleccione -");
	buscar_por.Add("Documento");
	buscar_por.Add("Apellido/s");
	buscar_por.Add("Nombre/s");
	buscar_por.SetIndex(0);
	buscar_por <<= THISBACK(HabilitarValorBusqueda);
	valor_buscar <<= THISBACK(FiltrarValor);
	
	valor_buscar.Disable();
	verModificar_btn.Disable();
	eliminar_btn.Disable();
	
	verAltas_btn <<= THISBACK(VerAltasMes);
	verBajas_btn <<= THISBACK(VerBajasMes);
	
	verModificar_btn <<= THISBACK(ModificarAfiliado);
	eliminar_btn <<= THISBACK(EliminarAfiliado);
	listaAdherentes_btn <<= THISBACK(IrAdherentes);
	listaSolicitudes_btn <<= THISBACK(IrSolicitudes);
	
	carnet_btn <<= THISBACK(GenerarCarnet);
	padron_btn <<= THISBACK(ConfigurarImpresion);
	ayuda_btn <<= THISBACK(Ayuda);
}

/**
*/
void ListadoAfiliadosDlg::HabilitarValorBusqueda()
{
	valor_buscar.Enable(buscar_por.GetIndex() > 0);
	valor_buscar.GotFocus();
}

/**
 Habilita los botones de edición y eliminación de afiliados.
*/
void ListadoAfiliadosDlg::HabilitarEdicionAfiliado()
{
	verModificar_btn.Enable();
	eliminar_btn.Enable();
}

/**
 Permite que cuando se ingrese un valor a filtrar, se filtre en la lista de afiliados.
*/
void ListadoAfiliadosDlg::FiltrarValor()
{
	if (valor_buscar.GetData().IsNull())
		lista_afiliados.ReQuery(true && TIPO_SOCIO_A == 1);
	else {
		SqlBool where;
		switch (buscar_por.GetIndex()) {
			// Documento
			case 1:
				where = Like(DNI_A, Wild(String().Cat() << valor_buscar.GetData() << "*"));//DNI_A == valor_buscar.GetData();
			break;
			// Apellido/s
			case 2:
				where = Like(APELLIDOS_A, Wild(String().Cat() << valor_buscar.GetData() << "*"),false);
			break;
			// Nombre/s
//			case 3:
//				where = Like(NOMBRES_A, Wild(String().Cat() << valor_buscar.GetData() << "*"),false);
//			break;
		}
		
		lista_afiliados.Query(where && TIPO_SOCIO_A == 1);
	}
}

/**
 Contenido del menú principal de la aplicacion
*/
void ListadoAfiliadosDlg::MenuPrincipal(Bar& bar)
{
	bar.Add("Archivo",THISBACK(MenuArchivo));
	bar.Add("Afiliados",THISBACK(MenuAfiliado));
	bar.Add("Opciones",THISBACK(MenuOpciones));
}

/**
 Opciones del menu "Archivo".
*/
void ListadoAfiliadosDlg::MenuArchivo(Bar& bar)
{
	bar.Add("Salir",CentroJyPImg::salir(),THISBACK(Exit))
	.Key(K_CTRL_X);
}

/**
 Opciones del menu "Afiliado".
*/
void ListadoAfiliadosDlg::MenuAfiliado(Bar& bar)
{
	bar.Add("Modificar Afiliado",CentroJyPImg::user_edit(),THISBACK(ModificarAfiliado))
	.Key(K_CTRL_M)
	.Tip("Permite modificar un afiliado del sistema");
	bar.Add("Cargar Afiliados desde archivo",CentroJyPImg::file_import16x16(),THISBACK(CargarArchivExcel))
	.Key(K_CTRL_C)
	.Tip("Permite cargar afiliados que esten almacenados enun archivo excel(.csv)");
}

/**
 Opciones del menu "Opciones".
*/
void ListadoAfiliadosDlg::MenuOpciones(Bar& bar)
{
	bar.Add("Generar Carnet",CentroJyPImg::carnet(),THISBACK(GenerarCarnet))
	.Enable(lista_afiliados.IsCursor());
	bar.Add("Configurar Impresión",CentroJyPImg::imprimir_carnet(),THISBACK(ConfigurarImpresion));
}

/**
 Opción para salir de la sección de listado de afiliados.
*/
void ListadoAfiliadosDlg::Exit()
{
	Break();
}

/**
 Opción para modificar los datos de un afiliado.
*/
void ListadoAfiliadosDlg::ModificarAfiliado()
{
	if (lista_afiliados.IsCursor()) {
		VerModificarAfiliadoDlg verModificarAfi;
		int nro_soc = lista_afiliados.GetKey();
		verModificarAfi.VerDatosAfiliado(nro_soc);
		verModificarAfi.SetListaPrincipal(lista_afiliados);
		verModificarAfi.Execute();
	}
}

/**
 Opción para eliminar un afiliado.
*/
void ListadoAfiliadosDlg::EliminarAfiliado()
{
	if (lista_afiliados.IsCursor() && PromptYesNo("¿Está seguro que quiere eliminar este afiliado?")) {
		Sql sql(pg_session);
		SqlId ALL("*");
		if (! (SQL * Select(ALL).From(AFILIADO).Where(NRO_SOCIO_A == lista_afiliados.GetKey()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		while(SQL.Fetch()) {
			if (! (sql * Insert(BAJA)(NRO_SOCIO_B,SQL[NRO_SOCIO_A])(BENEFICIO_B,SQL[BENEFICIO_A])(TIPO_SOCIO_B,SQL[TIPO_SOCIO_A])
					(LEY_B,SQL[LEY_A])(SUB_B,SQL[SUB_A])(CDGO_DTO_B,SQL[CDGO_DTO_A])(NRO_AFILIADO_B,SQL[NRO_AFILIADO_A])
					(TIPO_DOC_B,SQL[TIPO_DOC_A])(DNI_B,SQL[DNI_A])(APELLIDOS_B,SQL[APELLIDOS_A])/*(NOMBRES_B,SQL[NOMBRES_A])*/
					(CUOTA_B,SQL[CUOTA_A])(OBSERVACIONES_B,SQL[OBSERVACIONES_A])(FECHA_NAC_B,SQL[FECHA_NAC_A])
					(CALLE_B,SQL[CALLE_A])(NRO_CALLE_B,SQL[NRO_CALLE_A])(PISO_B,SQL[PISO_A])(DPTO_B,SQL[DPTO_A])(BARRIO_B,SQL[BARRIO_A])
					(CIUDAD_B,SQL[CIUDAD_A])(TEL_B,SQL[TEL_A])(TEL_ALT_B,SQL[TEL_ALT_A])(MAIL_B,SQL[MAIL_A])
					(REPARTICION_B,SQL[REPARTICION_A])(CARGO_B,SQL[CARGO_A])(CATERORIA_B,SQL[CATERORIA_A])(HABER_B,SQL[HABER_A])
					(MES_ABONO_B,SQL[MES_ABONO_A])(ANIO_ABONO_B,SQL[ANIO_ABONO_A])(FECHA_REGISTRO_B,SQL[FECHA_REGISTRO_A]))) {
				Exclamation(sql.GetLastError());
				return;
			}
			
			if (! (sql * Delete(AFILIADO).Where(NRO_SOCIO_A == lista_afiliados.GetKey()))) {
				Exclamation(sql.GetLastError());
				return;
			}
		}
		lista_afiliados.Query(TIPO_SOCIO_A == 1);
		lista_afiliados.GoEndPostQuery();
	}
}

/**
 Opción para ver las altas producdas durante el mes corriente.
*/
void ListadoAfiliadosDlg::VerAltasMes()
{
	AltasAfiliadosMes().Execute();
}

/**
 Opción para ver las bajas producdas durante el mes corriente.
*/
void ListadoAfiliadosDlg::VerBajasMes()
{
	BajaAfiliadoMes().Execute();
	lista_afiliados.Query();
	lista_afiliados.GoEndPostQuery();
}

/**
 Acceso directo a la lista de afiliados adherentes.
*/
void ListadoAfiliadosDlg::IrAdherentes()
{
	Hide();
	Close();
	ListadoAfiliadosAdherentesDlg().Run();
}

/**
 Acceso directo a la lista de solicitudes.
*/
void ListadoAfiliadosDlg::IrSolicitudes()
{
	Hide();
	Close();
	ListadoSolicitudesDlg().Run();
}

/**
 Opción para generar el carnet a un socio.
*/
void ListadoAfiliadosDlg::GenerarCarnet()
{
	if (lista_afiliados.IsCursor()) {
		ConfigurarCarnetDlg carnet;
		carnet.ConfigurandoCarnet(lista_afiliados.GetKey());
		carnet.Execute();
	}
}

/**
 Permite seleccion un archivo con formato '.csv' para leer.
*/
void ListadoAfiliadosDlg::CargarArchivExcel()
{
	FileSel fs;
	fs.Type("archivos txt (.txt)","*.txt");
	if (!fs.ExecuteOpen("Abrir archivo de Texto"))
		return;
	String nombArchivo = fs;
	String directorio = fs.Get();
	
	LeerArchivoExcel(fs);
}

/**
 Lee un archivo con formato '.csv' que viene como parametro.
*/
void ListadoAfiliadosDlg::LeerArchivoExcel(String archivo)
{
	char linea[139];
	fscanf(leerArchEx, "%s", linea);
	ifstream leerArchEx(archivo, ifstream::in);
	//Chequea si se leyo bien el archivo.	
	if (!leerArchEx) {
		PromptOK("Error inesperado al leer el archivo!");
   		return;
	}
	Progress progress;
	progress.Title("Leyendo archivo. Por favor espere!");
	//progress.Set(1,400);
	
	int i = 0;
	//Lee primer linea.
	leerArchEx.getline(linea, 139);
	ParsearAfiliadosExcel(linea);
	//Controla fin de archivo.
	while (!leerArchEx.eof()) {
		progress.Step(1);
		leerArchEx.getline(linea, 139);
		if (linea[0] != '\0') {
			ParsearAfiliadosExcel(linea);
		}
	}
	PromptOK("Ha finalizado la carga de afiliados.");
}

/**
 Parsea un archivo '.csv' que viene como parametro.
*/
void ListadoAfiliadosDlg::ParsearAfiliadosExcel(String linea)
{
	String sNroAfiliado, apeyNom, domicilio, tel, dni, sNroSocio, fechaNac, sLey, sCodDesc, sTipoDni, sCuota, fechaReg, sBeneficio, sTipoSocio;
	int iNroAfiliado, iNroSocio, iLey, iCodDesc, iTipoDni, iCuota, iBeneficio, iTipoSocio;
	int cont = 1;
	bool b = false;
	for (int i = 0 ; i <= linea.GetLength() ; i++) {
		if (linea[i] != 59) {
			switch (cont) {
				case 1:
					sNroSocio = String().Cat() << sNroSocio << char(linea[i]);
				break;
				case 2:
					apeyNom = String().Cat() << apeyNom << char(linea[i]);
				break;
				case 3:
					domicilio = String().Cat() << domicilio << char(linea[i]);
				break;
				case 4:
					tel = String().Cat() << tel << char(linea[i]);
				break;
				case 5:
					dni = String().Cat() << dni << char(linea[i]);
				break;
				case 6:
					sNroAfiliado = String().Cat() << sNroAfiliado << char(linea[i]);
				break;
				case 7:
					fechaNac = String().Cat() << fechaNac << char(linea[i]);
				break;
				case 8:
					sLey = String().Cat() << sLey << char(linea[i]);
				break;
				case 9:
					sCodDesc = String().Cat() << sCodDesc << char(linea[i]);
				break;
				case 10:
					sTipoDni = String().Cat() << sTipoDni << char(linea[i]);
				break;
				case 11:
					sCuota = String().Cat() << sCuota << char(linea[i]);
				break;
				case 12:
					fechaReg = String().Cat() << fechaReg << char(linea[i]);
				break;
				case 13:
					sBeneficio = String().Cat() << sBeneficio << char(linea[i]);
				break;
				case 14:
					sTipoSocio = String().Cat() << sTipoSocio << char(linea[i]);
				break;
			}
		}
		else
			cont++;
	}
	
	iNroSocio = atoi(sNroSocio);
	iNroAfiliado = atoi(sNroAfiliado);
	iLey = atoi(sLey);
	iCodDesc = atoi(sCodDesc);
//	if (sTipoDni == "DNI")
//		iTipoDni = 2;
//	if (sTipoDni == "LC")
//		iTipoDni = 3;
//	if (sTipoDni == "LE")
//		iTipoDni = 4;
	iCuota = atoi(sCuota);
	iBeneficio = atoi(sBeneficio);
	iTipoSocio = atoi(sTipoSocio);
	
	Sql sql(pg_session), sql2(pg_session);
	SqlId ALL("*");
	if (iTipoSocio == 1) {
		if (! (sql * Insert(AFILIADO)(NRO_SOCIO_A,iNroSocio)(BENEFICIO_A,iBeneficio)(TIPO_SOCIO_A,iTipoSocio)
				(LEY_A,iLey)(CDGO_DTO_A,iCodDesc)(NRO_AFILIADO_A,iNroAfiliado)(TIPO_DOC_A,sTipoDni)(DNI_A,dni)
				(APELLIDOS_A,apeyNom)(CUOTA_A,iCuota)(FECHA_NAC_A,fechaNac)(CALLE_A,domicilio)(TEL_A,tel)
				(FECHA_REGISTRO_A,fechaReg))) {
			Exclamation(sql.GetLastError());
			return;
		}
	
		lista_afiliados.Query(TIPO_SOCIO_A == 1);
		lista_afiliados.GoEndPostQuery();
	}
	else {
		if (! (sql2 * Insert(AFILIADOAD)(NRO_SOCIO_AD,iNroSocio)(BENEFICIO_AD,iBeneficio)(TIPO_SOCIO_AD,iTipoSocio)
				(LEY_AD,iLey)(CDGO_DTO_AD,iCodDesc)(NRO_AFILIADO_AD,iNroAfiliado)(TIPO_DOC_AD,sTipoDni)(DNI_AD,dni)
				(APELLIDOS_AD,apeyNom)(CUOTA_AD,iCuota)(FECHA_NAC_AD,fechaNac)(CALLE_AD,domicilio)(TEL_AD,tel)
				(FECHA_REGISTRO_AD,fechaReg))) {
			Exclamation(sql2.GetLastError());
			return;
		}
	
//		lista_afiliadosAd.Query(TIPO_SOCIO_AD == 1);
//		lista_afiliadosAd.GoEndPostQuery();
	}
}

/**
 Permite que se configuren las opciones para imprimir. Esto es, se elige el campo por el cual
 se desea ordenar la impresión, y luego se imprime.
*/
void ListadoAfiliadosDlg::ConfigurarImpresion()
{
	ConfigurarPadronDlg(1).Execute();
}

/**
 Opciones del menu "Ayuda".
*/
void ListadoAfiliadosDlg::Ayuda()
{
	HelpViewer help;
	help.Title("Ayuda acerca de Gestionar Afiliados");
	help.Execute();
}

//==============================================================================================

/**
 Formulario para ver y/o editar los datos de un afiliado.
*/
VerModificarAfiliadoDlg::VerModificarAfiliadoDlg()
{
	CtrlLayoutCancel(*this, "Formulario Afiliado");
	MinimizeBox();
	Icon(CentroJyPImg::icono_min32x32(),CentroJyPImg::icono());
	cancel.SetImage(CentroJyPImg::cancelar());
	guardar_btn.SetImage(CentroJyPImg::dialog_apply16x16());
	
	tipo_doc_a.Add("- Tipo -")
		.Add("DNI")
		.Add("LC")
		.Add("LE")
		.Add("Pasaporte")
	;
	tipo_doc_a.SetIndex(0);
	
	mes_abono_a.Add("- Mes -")
		.Add("Enero")
		.Add("Febrero")
		.Add("Marzo")
		.Add("Abril")
		.Add("Mayo")
		.Add("Junio")
		.Add("Julio")
		.Add("Agosto")
		.Add("Septiembre")
		.Add("Octubre")
		.Add("Noviembre")
		.Add("Diciembre")
	;
	mes_abono_a.SetIndex(0);
	
	sql_ctrls
		(NRO_SOCIO_A, nro_socio_a)
		//(BENEFICIO_A, beneficio_a)
		//(TIPO_SOCIO_A, tipo_socio_a)
		(LEY_A, ley_a)
		(SUB_A, sub_a)
		(CDGO_DTO_A, cdgo_dto_a)
		(NRO_AFILIADO_A, nro_afiliado_a)
		//(TIPO_DOC_A, tipo_doc_a)
		(DNI_A, dni_a)
		(APELLIDOS_A, apellidos_a)
		//(NOMBRES_A, nombres_a)
		//(DCTO_A, dcto_a)
		(CUOTA_A, cuota_a)
		(OBSERVACIONES_A, observaciones_a)
		(FECHA_NAC_A, fecha_nac_a)
		(CALLE_A, calle_a)
		(NRO_CALLE_A, nro_calle_a)
		(PISO_A, piso_a)
		(DPTO_A, dpto_a)
		(BARRIO_A, barrio_a)
		(CIUDAD_A, ciudad_a)
		(TEL_A, tel_a)
		(TEL_ALT_A, tel_alt_a)
		(MAIL_A, mail_a)
		(REPARTICION_A, reparticion_a)
		(CARGO_A, cargo_a)
		(CATERORIA_A, categoria_a)
		(HABER_A, haber_a)
		//(MES_ABONO_A, mes_abono_a)
		(ANIO_ABONO_A, anio_abono_a)
		(FECHA_REGISTRO_A, fecha_reg_a)
	;
	
	sql_ctrls2
		(NRO_SOCIO_AD, nro_socio_a)
		//(BENEFICIO_AD, beneficio_a)
		//(TIPO_SOCIO_AD, tipo_socio_a)
		(LEY_AD, ley_a)
		(SUB_AD, sub_a)
		(CDGO_DTO_AD, cdgo_dto_a)
		(NRO_AFILIADO_AD, nro_afiliado_a)
		//(TIPO_DOC_AD, tipo_doc_a)
		(DNI_AD, dni_a)
		(APELLIDOS_AD, apellidos_a)
		//(NOMBRES_AD, nombres_a)
		//(DCTO_AD, dcto_a)
		(CUOTA_AD, cuota_a)
		(OBSERVACIONES_AD, observaciones_a)
		(FECHA_NAC_AD, fecha_nac_a)
		(CALLE_AD, calle_a)
		(NRO_CALLE_AD, nro_calle_a)
		(PISO_AD, piso_a)
		(DPTO_AD, dpto_a)
		(BARRIO_AD, barrio_a)
		(CIUDAD_AD, ciudad_a)
		(TEL_AD, tel_a)
		(TEL_ALT_AD, tel_alt_a)
		(MAIL_AD, mail_a)
		(REPARTICION_AD, reparticion_a)
		(CARGO_AD, cargo_a)
		(CATERORIA_AD, categoria_a)
		(HABER_AD, haber_a)
		//(MES_ABONO_A, mes_abono_a)
		(ANIO_ABONO_AD, anio_abono_a)
		(FECHA_REGISTRO_AD, fecha_reg_a)
	;
	
	hab_edicion_btn <<= THISBACK(HabilitarCtrls);
	guardar_btn <<= THISBACK(GuardarModificacion);
}

/**
 Habilita los ctrls para que puedan ser editados.
*/
void VerModificarAfiliadoDlg::HabilitarCtrls()
{
	sql_ctrls.Enable();
}

/**
 Deshabilita los ctrls para que no puedan ser editados.
*/
void VerModificarAfiliadoDlg::DeshabilitarCtrls()
{
	sql_ctrls.Disable();
}

/**
 Muestra los datos completos de un afiliado y da la opción de editarlos.
*/
void VerModificarAfiliadoDlg::VerDatosAfiliado(int nro_soc)
{
	nro_soc_seleccionado = nro_soc;
	if (! (SQL * Select(sql_ctrls).From(AFILIADO).Where(NRO_SOCIO_A == nro_soc))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	if (! sql_ctrls.Fetch(SQL))
		return;
	
	if (! (SQL * Select(BENEFICIO_A, TIPO_SOCIO_A, TIPO_DOC_A, MES_ABONO_A).From(AFILIADO).Where(NRO_SOCIO_A == nro_soc))) {
		Exclamation(SQL.GetLastError());
		return;
	}
	
	while (SQL.Fetch()) {
		beneficio_a <<= SQL[BENEFICIO_A];
		tipo_socio_a <<= SQL[TIPO_SOCIO_A];
		if (SQL[TIPO_DOC_A] == "DNI")
			tipo_doc_a.SetIndex(1);
		if (SQL[TIPO_DOC_A] == "LC")
			tipo_doc_a.SetIndex(2);
		if (SQL[TIPO_DOC_A] == "LE")
			tipo_doc_a.SetIndex(3);
		if (SQL[TIPO_DOC_A] == "Pasaporte")
			tipo_doc_a.SetIndex(4);
//		tipo_doc_a.SetIndex(SQL[TIPO_DOC_A]);
		if (!SQL[MES_ABONO_A].IsNull())
			mes_abono_a.SetIndex(SQL[MES_ABONO_A]);
	}
	DeshabilitarCtrls();
}

bool VerModificarAfiliadoDlg::esLetra(int c)
{
	if ((c >= 65 && c <= 90) || (c >= 97 && c <= 122) || (c == -61) || (c == -111) || (c == 44))
		return true;
	
	return false;
}

/**
 Controla que el apellido y el nombre contengan solo letras y espacios.
 retornará true si contiene letras y espacios, en caso contrario retornará false.
*/
bool VerModificarAfiliadoDlg::NombreyApellidoValido(String nombre)
{
	bool valido = true;
	
	for (int i = 0 ; i < nombre.GetLength() && valido ; i++) {
		if ((esLetra(nombre[i])) || (nombre[i] == 32))
			valido = true;
		else
			valido = false;
	}
	
	return valido;
}

bool VerModificarAfiliadoDlg::DocumentoValido(String dni)
{
	for (int i = 0 ; i < dni.GetLength() ; i++) {
		if (dni[i] < 48 || dni[i] > 57)
			return false;
	}
	return true;
}

bool VerModificarAfiliadoDlg::EmailValido(String email)
{
	int pos_arroba = -1, pos_punto = -1;
	
	for (int i = 0 ; i < email.GetLength() ; i++) {
		if (email[i] == 64)
			pos_arroba = i;
		else if (email[i] == 46)
			pos_punto = i;
	}
	
	if (pos_arroba == -1 || pos_punto == -1)
		return false;
	
	if (pos_arroba > pos_punto)
		return false;

	if (pos_punto == email.GetLength())
		return false;
	
	return true;
}

bool VerModificarAfiliadoDlg::ValidarTelefono(String telefono_)
{
	for (int i = 0 ; i < telefono_.GetLength() ; i++) {
		if (telefono_[i] < 48 || telefono_[i] > 57)
			return false;
	}
	return true;
}

void VerModificarAfiliadoDlg::GuardarModificacion()
{
	String tipo_doc;
	if (apellidos_a.GetData().IsNull()) {
		Exclamation("Debe ingresar el/los apellido/s");
		return;
	}
	
	if (! NombreyApellidoValido(apellidos_a.GetData())) {
		Exclamation("El apellido debe contener sólo letras");
		return;
	}
	
//	if (nombres_a.GetData().IsNull()) {
//		Exclamation("Debe ingresar el/los nombre/s");
//		return;
//	}
//	
//	if (! NombreyApellidoValido(nombres_a.GetData())) {
//		Exclamation("El nombre debe contener sólo letras");
//		return;
//	}
	
	if (fecha_nac_a.GetData().IsNull()) {
		Exclamation("Debe ingresar la fecha de nacimiento.");
		return;
	}
	
	if (! fecha_nac_a.Accept())
		return;
	
	if (tipo_doc_a.GetIndex() == 0) {
		Exclamation("Debe elegir el tipo de documento");
		return;
	}
	if (tipo_doc_a.GetIndex() == 1)
		tipo_doc = "DNI";
	if (tipo_doc_a.GetIndex() == 2)
		tipo_doc = "LC";
	if (tipo_doc_a.GetIndex() == 3)
		tipo_doc = "LE";		
	if (tipo_doc_a.GetIndex() == 4)
		tipo_doc = "Pasaporte";
	
	if (dni_a.GetLength() < 7) {
		Exclamation("El formato del documento es incorrecto");
		return;
	}
	
	if (! DocumentoValido(dni_a.GetData())) {
		Exclamation("El Documento debe contener sólo números");
		return;
	}
	
	if (calle_a.GetData().IsNull()) {
		Exclamation("Debe ingresar la calle");
		return;
	}
	
	if (ciudad_a.GetData().IsNull()) {
		Exclamation("Debe ingresar la ciudad");
		return;	
	}
	if (tel_a.GetData().IsNull()) {
		Exclamation("Debe ingresar un número de telefono");
		return;
	}
	
	if (! ValidarTelefono(tel_a.GetData())) {
		Exclamation("El telefono ingresado es incorrecto. Compruebe que contiene solo números");
		return;
	}
	
	if (! tel_alt_a.GetData().IsNull()) {
		if (! ValidarTelefono(tel_alt_a.GetData())) {
			Exclamation("El telefono alternativo es incorrecto. Compruebe que contiene sólo números");
			return;
		}
	}
	
	if (! mail_a.GetData().IsNull()) {
		if (! EmailValido(mail_a.GetData())) {
			Exclamation("La dirección de e-mail parece no ser una dirección válida. Compruebe que es correcta e intente nuevamente");
			return;
		}
	}
	
	if (nro_socio_a.GetData().IsNull()) {
		Exclamation("Debe ingresar el Nro. de Socio");
		return;
	}
	
//	if (nro_socio_a.GetLength() < 6) {
//		Exclamation("El Nro. de Socio debe ser de 6 dígitos");
//		return;
//	}
	
	if (ley_a.GetData().IsNull()) {
		Exclamation("Debe ingresar la ley");
		return;
	}
	
	if (ley_a.GetLength() == 1) {
		Exclamation("La ley debe ser de dos dígitos");
		return;
	}
	
	if (! fecha_reg_a.Accept())
		return;
	
	if (cdgo_dto_a.GetData().IsNull()) {
		Exclamation("Debe ingresar el código de descuento");
		return;	
	}
	
	if (cuota_a.GetData().IsNull()) {
		Exclamation("Debe ingresar la cuota");
		return;	
	}
	
	Sql sql2(pg_session);
	
	if (tipo_socio_a == 1) {
		if (!(SQL * sql_ctrls.Update(AFILIADO).Where(NRO_SOCIO_A == nro_soc_seleccionado) (TIPO_DOC_A,tipo_doc)
				 (TIPO_SOCIO_A,~tipo_socio_a) (BENEFICIO_A,~beneficio_a) (MES_ABONO_A,mes_abono_a.GetIndex()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
	}
	else {
		if (!(SQL * sql_ctrls2.Insert(AFILIADOAD).Where(NRO_SOCIO_AD == nro_soc_seleccionado) (TIPO_DOC_AD,tipo_doc)
				 (TIPO_SOCIO_AD,~tipo_socio_a) (BENEFICIO_AD,~beneficio_a) (MES_ABONO_AD,mes_abono_a.GetIndex()))) {
			Exclamation(SQL.GetLastError());
			return;
		}
		
		if (! (SQL * Delete(AFILIADO).Where(NRO_SOCIO_A == nro_soc_seleccionado))) {
			Exclamation(SQL.GetLastError());
			return;
		}
	}
	
	Hide();
		
	PromptOK("La modificación se realizó exitosamente");

	lista_padre -> Query();
	lista_padre -> FindSetCursor(nro_soc_seleccionado);
	
	Close();
}